package com.leador.map.api.location;


import android.location.Criteria;
import android.location.LocationManager;
import android.location.LocationProvider;

/**
 * 位置提供者代理
 */
public class LocationProviderProxy {
    public static final int AVAILABLE = LocationProvider.AVAILABLE;
    public static final int OUT_OF_SERVICE = LocationProvider.OUT_OF_SERVICE;
    public static final int TEMPORARILY_UNAVAILABLE = LocationProvider.TEMPORARILY_UNAVAILABLE;

    public static final String LocNetwork = "lbs";

    private LocationManager androidLocManager;
    private String mName;

    protected LocationProviderProxy(LocationManager manager, String name) {
        androidLocManager = manager;
        mName = name;
    }

    static LocationProviderProxy makeLocationProviderProxy(
            LocationManager manager, String name) {
        return new LocationProviderProxy(manager, name);
    }

    private LocationProvider getRealProvider() {
        return androidLocManager.getProvider(mName);
    }

    /**
     * 返回精确度。
     * @return 精度 单位米。
     */
    public int getAccuracy() {
        if (LocNetwork.equals(mName)) {
            return Criteria.ACCURACY_COARSE;
        }
        return getRealProvider().getAccuracy();
    }

    /**
     * 返回Provider名称。
     * @return Provider名称。
     */
    public String getName() {
        if (LocNetwork.equals(mName)) {
            return LocNetwork;
        }
        return getRealProvider().getName();
    }


    /**
     * 返回耗电量情况。
     * @return 返回值 {@link Criteria.POWER_LOW Criteria.POWER_LOW｝低能耗，
     * {@link Criteria.POWER_MEDIUM Criteria.POWER_MEDIUM｝中能耗，
     * {@link Criteria.POWER_HIGH Criteria.POWER_HIGH} 高能耗。
     */
    public int getPowerRequirement() {
        if (LocNetwork.equals(mName)) {
            return Criteria.POWER_MEDIUM;
        }
        return getRealProvider().getPowerRequirement();
    }


    /**
     * 返回provider是否收费。
     * @return true 收费，false 不收费。
     */
    public boolean hasMonetaryCost() {
        if (LocNetwork.equals(mName)) {
            return false;
        }
        return getRealProvider().hasMonetaryCost();
    }

    /**
     * 判断是否符合给定的criteria
     * @param criteria
     * @return  true 符合，false 不符合。
     */
    public boolean meetsCriteria(Criteria criteria) {
        if (LocNetwork.equals(mName)) {
            if (criteria == null) {
                return true;
            }
            return !(criteria.isAltitudeRequired()
                    || criteria.isBearingRequired()
                    || criteria.isSpeedRequired() || criteria.getAccuracy() == Criteria.ACCURACY_FINE);
        }
        return getRealProvider().meetsCriteria(criteria);
    }

    /**
     * 返回是否需要移动网络
     * @return true 需要，false 不需要。
     */
    public boolean requiresCell() {
        if (LocNetwork.equals(mName)) {
            return true;
        }
        return getRealProvider().requiresCell();
    }

    /**
     * 返回是否需要网络。
     * @return true 需要，false 不需要。
     */
    public boolean requiresNetwork() {
        if (LocNetwork.equals(mName)) {
            return true;
        }
        return getRealProvider().requiresNetwork();
    }

    /**
     * 返回是否需要卫星定位。
     * @return true 需要，false 不需要。
     */
    public boolean requiresSatellite() {
        if (LocNetwork.equals(mName)) {
            return false;
        }
        return getRealProvider().requiresNetwork();
    }

    /**
     * 返回是否支持高度信息。
     * @return true 支持，false 不支持。
     */
    public boolean supportsAltitude() {
        if (LocNetwork.equals(mName)) {
            return false;
        }
        return getRealProvider().supportsAltitude();
    }

    /**
     * 返回是否支持方位信息。
     * @return true 支持，false 不支持。
     */
    public boolean supportsBearing() {
        if (LocNetwork.equals(mName)) {
            return false;
        }
        return getRealProvider().supportsBearing();
    }

    //

    /**
     * 返回是否支持速度信息。
     * @return true 支持，false 不支持。
     */
    public boolean supportsSpeed() {
        if (LocNetwork.equals(mName)) {
            return false;
        }
        return getRealProvider().supportsSpeed();
    }
}
